#ifndef TRANSFORM_H_
#define TRANSFORM_H_

#include "Matrix4f.h"

class Transform
{
public:
    // Inicia uma transformação vazia (identidade)
    Transform();

    // Retorna o vetor de translação
    Vector3f getTranslation() const;

    // Retorna o vetor (rotx, roty, rotz) contendo os ângulos de rotação no eixo x, y e z, respectivamente.
    Vector3f getRotation() const;

    // Retorna o vetor (sx, sy, sz) contendo os fatores de escala no x, y, e z, respectivamente.
    Vector3f getScale() const;

    // Seta a translação
    void setTranslation(const Vector3f &vec);

    // Seta a escala
    void setScale(const Vector3f &vec);

    // Seta a rotação
    void setRotation(const Vector3f &vec);

    // Acumula uma translação dada pelo vetor vec
    Transform& translate(const Vector3f &vec);

    // Acumula uma escala dada pelo vetor vec
    Transform& scale(const Vector3f &vec);

    // Acumula uma rotação no eixo X dada em graus
    Transform& rotateX(float ang);

    // Acumula uma rotação no eixo Y dada em graus
    Transform& rotateY(float ang);

    // Acumula uma rotação no eixo Z dada em graus
    Transform& rotateZ(float ang);

    // Concatena esta transformação com a transformação t e returna o resultado
    Transform operator*(const Transform& t) const;

    // Retorna a matrix que representa esta transformação
    Matrix4f matrix() const;

    // Retorna a matrix que representa a transformação inversa
    Matrix4f invMatrix() const;

    // Aplica esta transformação no openGL
    void applyGL() const;

    // Aplica transformação inversa no openGL
    void applyInverseGL();
private:
    //Atributos privados que guardam as matrizes da transformacao

    //Vetor que guarda a translacao
    Vector3f trans;
    Vector3f rot;
    Vector3f scal;

};

#endif /* TRANSFORM_H_ */
